package cn.edu.nju.ws.sview.wyge.relations.index;

import java.io.File;
import java.io.IOException;
import java.net.URLDecoder;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Index;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.PrefixQuery;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.BooleanClause.Occur;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.Version;

import cn.edu.nju.ws.sview.database.DBConnectionFactory;
import cn.edu.nju.ws.sview.views.Collaboration;
import cn.edu.nju.ws.sview.wyge.relations.datasets.DatasetItem;
import cn.edu.nju.ws.sview.wyge.relations.index.indexTask.IndexTask;

/**
 * index manager
 * 
 * @author qxliu
 * @author Weiyi Ge
 * @author qxliu 2012年10月22日16:53:21 deprecated
 */
@Deprecated
public class IndexManager {
//	static IndexManager im = null;
//	static Directory dir = null;
//	private static File file = null;
//	String FIELDNAME_DS = "ds";
//	String FIELDNAME_TOTAL = "total";
//	String FIELDNAME_NAME = "name";
//	private static IndexWriter writer = null;
//	
//	static{
//		Properties properties = new Properties();
//		try {
//			properties.load(IndexManager.class.getClassLoader().getResourceAsStream("conf.properties")) ;
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		file = new File(properties.getProperty("index_directory"));
//		IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_35,
//				new StandardAnalyzer(Version.LUCENE_35));
//		try {
//			if(dir==null){
//				dir = FSDirectory.open(file);
//			}
//			writer = new IndexWriter(dir, iwc);
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	// ==============for test
//	public static void main(String[] args) throws IOException, SQLException {
//		IndexManager.getIndexManager().initialize(null);
//		IndexManager.getIndexManager().closeAll();
//	}
//
//	public void showAll() {
//		try {
//			if (dir == null) {
//				dir = FSDirectory.open(file);
//			}
//			IndexReader ir = IndexReader.open(dir);
//			Document doc = null;
//			for (int i = 0; i < ir.numDocs(); i++) {
//				doc = ir.document(i);
//				System.out.println(doc.get(FIELDNAME_DS) + "\t"
//						+ doc.get(FIELDNAME_TOTAL) + "\t"
//						+ doc.get(FIELDNAME_NAME));
//			}
//			System.out.println("total:" + ir.numDocs());
//			ir.close();
//		} catch (CorruptIndexException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	// ===========
//	/**
//	 * ！！！当对象不需再用时，一定要调用此函数关闭directory
//	 */
//	public void closeAll() {
//		try {
//			IndexManager.writer.close();
//			if (dir != null) {
//
//				dir.close();
//
//			}
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	public static IndexManager getIndexManager() {
//		if (im != null) {
//			return im;
//		}
//		Properties properties = new Properties();
//		try {
//			properties.load(IndexManager.class.getClassLoader()
//					.getResourceAsStream("conf.properties"));
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		im = new IndexManager();
//		properties.clear();
//		return im;
//	}
//
//	public void initialize(String from) throws SQLException {
//		try {
//			if (dir == null) {
//				dir = FSDirectory.open(file);
//			}
//			IndexReader ir = IndexReader.open(dir);
//			ir.close();
//		} catch (Exception e) {
//			ArrayList<DatasetItem> dss = new ArrayList<DatasetItem>();
//			new IndexTask(dss);
//
//			Connection con2 = DBConnectionFactory.getConnection();
//			Statement stat2 = con2.createStatement();
//			ResultSet rs2 = stat2
//					.executeQuery("SELECT id, name FROM custom_dataset");
//			while (rs2.next()) {
//				int id = rs2.getInt(1);
//				String name = rs2.getString(2);
//				DatasetItem ds = new DatasetItem("custom", id, name);
//				dss.add(ds);
//			}
//			rs2.close();
//			stat2.close();
//			con2.close();
//
//			addDatasets(dss);
//		}
//	}
//
//	/**
//	 * 
//	 * @param path
//	 *            索引所在目录
//	 */
//	public IndexManager() {
//	}
//
//	/**
//	 * 通过term检索url
//	 * 
//	 * @param keyword
//	 * @param topnum
//	 *            最多返回的结果条数
//	 * @return
//	 */
//	public ArrayList<DatasetItem> getDatasetsByTerm(String keyword, int topnum) {
//		ArrayList<DatasetItem> dss = new ArrayList<DatasetItem>();
//		try {
//			if (dir == null) {
//				dir = FSDirectory.open(file);
//			}
//			IndexReader ir = IndexReader.open(dir);
//			IndexSearcher is = new IndexSearcher(ir);
//
//			StringSplitter split = StringSplitter.getStringSplitter();
//			List<String> kws = split.splitByDelimit(keyword);
//
//			BooleanQuery query = new BooleanQuery();
//			for (String kw : kws) {
//				kw = kw.toLowerCase();
//				if (kw.equals("http") || kw.equals("ftp")) {
//					continue;
//				}
//				Query tq = new PrefixQuery(new Term(FIELDNAME_TOTAL, kw));
//				query.add(tq, Occur.MUST);
//			}
//
//			TopDocs tdoc = is.search(query, topnum);
//			ScoreDoc[] docs = tdoc.scoreDocs;
//			for (ScoreDoc sd : docs) {
//				String ds_serial = is.doc(sd.doc).get(FIELDNAME_DS);
//				String name = is.doc(sd.doc).get(FIELDNAME_NAME);
//				String[] sps = ds_serial.split(":");
//				DatasetItem ds = new DatasetItem(sps[0],
//						Integer.parseInt(sps[1]), name);
//				dss.add(ds);
//			}
//			is.close();
//			ir.close();
//		} catch (CorruptIndexException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//
//		return dss;
//	}
//
//	/**
//	 * 删除一个url
//	 * 
//	 * @param url
//	 */
//	public void removeDataset(DatasetItem ds) {
//		long start = System.currentTimeMillis();
//		try {
//			if (dir == null) {
//				dir = FSDirectory.open(file);
//			}
//			IndexWriter iw = this.getWriter(dir);
//			String ds_serial = ds.getGenre() + ":" + ds.getId();
//			iw.deleteDocuments(new Term(FIELDNAME_DS, ds_serial));
//			iw.close();
//		} catch (CorruptIndexException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		System.out.println("removed! cost time:"
//				+ (System.currentTimeMillis() - start));
//	}
//
//	public void addDatasets(ArrayList<DatasetItem> dss) {
//		IndexWriter iw;
//		try {
//			if (dir == null) {
//				dir = FSDirectory.open(file);
//			}
//			iw = this.getWriter(dir);
//			Document doc = null;
//			String ds_serial = null;
//			int i;
//			for (i = 0; i < dss.size(); i++) {
//				DatasetItem ds = dss.get(i);
//				ds_serial = ds.getGenre() + ":" + ds.getId();
//				doc = new Document();
//				doc.add(new Field(FIELDNAME_DS, ds_serial, Store.YES,
//						Index.NOT_ANALYZED_NO_NORMS));
//				doc.add(new Field(FIELDNAME_NAME, ds.getName("").getName(), Store.YES,
//						Index.NOT_ANALYZED_NO_NORMS));//======
//				doc.add(new Field(FIELDNAME_TOTAL, getSplitedString(ds
//						.getName("").getName()), Store.YES, Index.ANALYZED));
//				iw.updateDocument(new Term(FIELDNAME_DS, ds_serial), doc);
//			}
//		} catch (CorruptIndexException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (LockObtainFailedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		} catch (IOException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//	}
//
//	private String getSplitedString(String url) {
//		if (url.indexOf("://") != -1) {
//			url = url.substring(7);
//		}
//		String str = StringSplitter.getStringSplitter().splitByDelimit(url)
//				.toString();
//		str = str.replace(", ", " ");
//		str = str.replace("[", "");
//		str = str.replace("]", "");
//		return str;
//	}
//
//	private IndexWriter getWriter(Directory dir) throws CorruptIndexException,
//			LockObtainFailedException, IOException {
//		return IndexManager.writer;
//	}
}
